package classfile

import "encoding/binary"

// 用于读取class文件的工具，构造时需要传入class文件的内容，是一个字节数组
type ClassReader struct {
	data []byte
}

// 从class文件数据流中读取一个字节
func (self *ClassReader) ReadUint8() uint8 {
	val := self.data[0]
	self.data = self.data[1:]
	return val
}

// 从class文件数据流中读取两个字节
func (self *ClassReader) ReadUint16() uint16 {
	val := binary.BigEndian.Uint16(self.data)
	self.data = self.data[2:]
	return val
}

// 从class文件数据流中读取四个字节
func (self *ClassReader) ReadUint32() uint32 {
	val := binary.BigEndian.Uint32(self.data)
	self.data = self.data[4:]
	return val
}

// 从class文件数据流中读取八个字节
func (self *ClassReader) ReadUint64() uint64 {
	val := binary.BigEndian.Uint64(self.data)
	self.data = self.data[8:]
	return val
}

func (self *ClassReader) ReadUint16s() []uint16 {
	n := self.ReadUint16()
	s := make([]uint16, n)
	for i := range s {
		s[i] = self.ReadUint16()
	}
	return s
}

// 从class文件数据流中读取一些字节，长度由传入的参数指定
func (self *ClassReader) ReadBytes(lenth uint32) []byte {
	bytes := self.data[0:lenth]
	self.data = self.data[lenth:]
	return bytes
}
